#!/git/aslclass.py
# Copyright 2013 Aditya Naik
# Licensed under the Apache License, Version 2.0
# http://www.apache.org/licenses/LICENSE-2.0

# ---Version 2.3.0---

# imports
import sys
import os
import msvcrt
from timeit import timeit as time
from time import clock as clock
from paths import listpaths
import re

class ASLreport:
	
	def __init__(self):
		self.shotcount=0
		self.pauseinterval=[]
		self.shotlist=[]
		self.totaltime=0
	
	# begin
	def metadata(self):
		load=input("Do you want to start a new state? (y/n +enter) (n=load state)\n")
		# load a file or start a new state?
		if load=='y': pass
		elif load=='n': self.loader()
		
		self.name=input("\nEnter movie name:\n")
		
		print("press enter to start")
		
		keystroke=str(msvcrt.getch())[-2]
		if keystroke=="r":
			print("counter begins")
			self.key()
		else: print("Unknown keystroke ")

	def loader(self):
		pathlist=os.listdir(".")
		print(pathlist)
		
		serial=input("Enter the serial number of the savefile (starts from 0)\n")
		# if the filetype does not have the required extension
		if listpaths('.')[int(serial)][-9:len(listpaths('.')[int(serial)])]!="savestate": 
			sys.exit("unknown filetype")
		loader=open(listpaths('.')[int(serial)], mode="r").read()
		
		# loading algorithm: search for required values with regex
		data=re.search(r"(?P<MovieName>.+)\n(?P<TotalTime>.+)\n(?P<ShotCount>\d+)",loader)
		
		# assign values
		try:
			self.name=data.group('MovieName')
			self.totaltime=float(data.group('TotalTime'))
			self.shotcount=int(data.group('ShotCount'))
		# .savestate file with incorrect or corrupt data
		except AttributeError: 
			sys.exit("unknown filetype")
		print("press enter to start loaded state")
		
		if str(msvcrt.getch())[-2]=="r":
			print("loaded state")
			self.key()
		else: print("Unknown keystroke ")
		
	
	def key(self):
		clock()
		tottime=0
		# wait for keystroke
		keystroke=str(msvcrt.getch())[-2]
		if keystroke=="s":
			# shot detected
			timestamp=clock()
			self.shotcount=self.shotcount+1
			
			if self.pauseinterval!=[]:
			# if 'pause' has never been used before
				for pausetime in self.pauseinterval: tottime=tottime+pausetime
				actualtime=float(timestamp)-float(tottime)
				self.shotlist.append((self.shotcount,actualtime ))
				print("Shot #%d at %fs "%(self.shotcount,actualtime))
			else:
				self.shotlist.append((self.shotcount,timestamp ))
				print("Shot #%d at %fs "%(self.shotcount,timestamp))
			self.key() 
		
		elif keystroke=="p": self.pause()
		elif keystroke=="e" : self.reset()
		else: print("Unkown keystroke")
	
	def pause(self):
		print("paused")
		self.startpause=clock()
		startagain=str(msvcrt.getch())[-2]
		
		if startagain=="p": 
			self.endpause=clock()
			print("restarted")
			# the next line will help to calculate the total time by keeping track of time lost in pauses
			self.pauseinterval.append(self.endpause-self.startpause)
			self.key()
		elif startagain=="e": self.reset()
		else: print("Unknown keystroke")
	
	def reset(self):
		print('\n==ASLreport for "%s"=='%self.name)
		self.totaltime=clock()
		
		for pausetime in self.pauseinterval: 
			# subtract pausetime from the totaltime of the session
			self.totaltime=self.totaltime-pausetime
		print(self.totaltime)
		
		try:  self.totaltime/self.shotcount
		# if shotcount is 0
		except ZeroDivisionError: sys.exit("no shots recorded")
		self.ASL=self.totaltime/self.shotcount
		
		print("number of shots=%d"%self.shotcount)	
		print("ASL =%fseconds"%self.ASL)
		self.report=input("\nDo you want to generate report file?(y/n)\n")
		if self.report=="y": self.reportgenerator()
		elif self.report=="n": sys.exit(0)
		
	def reportgenerator(self):
		fileopen=open(r"%s.ASLreport"%self.name,mode="w")
		fileopen.write(
		"ASL report for %s \n\n Record Time=%f\n Recorded Shots=%d\n ASL=%f\nShot Timestamps:\n%s"%(self.name,self.totaltime,self.shotcount,self.ASL,str(self.shotlist)))
	
	def savestate(self):
		# open and write a '.savestate' file with the required data and in a specific format
		saver=open("%s.savestate"%self.name, mode="w")
		saver.write("%s\n%f\n%f"%(self.name,self.totaltime,self.shotcount))
	
	
# --main boilerplate--
if __name__=="__main__":
	ASLreport().metadata()